<?php

require_once("Lib/Parameters.php");

session_start();

/**
 * Classe che gestice l'accesso come amministratore
 */
class Admin
{

	const SESSIONS_TABLE_NAME = "Login";

	const SESSION_USER_CODE = "SessionUserCode";
	const SESSION_LIFETIME = 7200;//2h*60m*60s;

	/**
	 * Costruttore.
	 * Alla creazione di questa classe viene eseguita una query che elimina
	 * eventuali sessioni scadute.
	 * @param DatabaseManager $db DB da cui rimuovere le sessioni scadute.
	 */
	public function __construct($db)
	{
		$db->EraseRecords('Login','UltimoAccesso < '.(time()-self::SESSION_LIFETIME));
		ini_set('session.gc_maxlifetime', self::SESSION_LIFETIME);
	}

	/**
	 * Verifica se la sessione è attualmente attiva.
	 * @param DatabaseManager $db Database su cui controllare la sessione.
	 * @return boolean Vero in caso la sessione sia ancora attiva, falso nel
	 * caso la sessione sia scaduta o non esiste.
	 */
	public function querySession($db)
	{
		if(!isset($_SESSION[self::SESSION_USER_CODE]))
			return false;
		$sid = session_id();
		if($db->GetRecordsNum('Login',"IDSessione = '".$sid."' AND CodSessione = ".$_SESSION[self::SESSION_USER_CODE]) > 0)
		{
			$newCode = rand(1, 100000);
			$lastAccess = time();
			$_SESSION[self::SESSION_USER_CODE] = $newCode;
			return $db->UpdateRecord(self::SESSIONS_TABLE_NAME, "CodSessione = ".$newCode.", UltimoAccesso = ".$lastAccess,
					"IDSessione = '".session_id()."'");
		}
		return false;
	}

	/**
	 * Esegue il login con una apposita password in input.
	 * @param DatabaseManager $db Database su cui attivare la sessione e
	 * controllare la credenziale di accesso.
	 * @param string $input_pass Password da usare per tentare il login.
	 * @return boolean Vero se il login è andato a buon fine e la sessione è
	 * ora attiva, falso nel caso la password passata sia errata o qualcosa è
	 * andato storto.
	 */
	public function login($db,$input_pass)
	{
		$pass = Parameters::getParameter($db, Parameters::PARAMETER_ADMIN_PASS);
		if($input_pass == $pass)
		{
			$newCode = rand(1, 100000);
			$lastAccess = time();
			$_SESSION[self::SESSION_USER_CODE] = $newCode;
			$sid = session_id();
			if($db->GetRecordsNum(self::SESSIONS_TABLE_NAME, "IDSessione = '".$sid."'") > 0)
				return $db->UpdateRecord(self::SESSIONS_TABLE_NAME, "CodSessione = ".$newCode.", UltimoAccesso = ".$lastAccess,
					"IDSessione = '".$sid."'");
			else
				return $db->AddRecord(self::SESSIONS_TABLE_NAME, "IDSessione, CodSessione, UltimoAccesso", "'".$sid."', ".$newCode.", ".$lastAccess);
		}
		return false;
	}

	/**
	 * Effettua il logout aggiornando opportunamente il DB e chiudendo la
	 * sessione.
	 * @param DatabaseManager $db Database da aggiornare.
	 */
	public function logout($db)
	{
		$db->EraseRecords(self::SESSIONS_TABLE_NAME,"IDSessione = '".session_id()."'");
		session_destroy();
	}

}

?>
